例题:建立一个视图V1,显示老师与学生的授课关系,包括年份,学期,课程名称,老师ID,老师姓名,学生ID,学生姓名
create view v1 asselect year,semester,title,a.id i_id,d.namei_name,b.id s_id,c.name s_namefrom takes a join teaches b using(course_id,sec_id,year,semester)join student c on(a.id = c.id)join instructor d on (b.id = d.id)join course using(course_id) 向表中添加或删除约束 // 添加主键约束alter table 表名 add constraint 自定义主键名 primary key(字段)//添加外键约束alter table 表名 add constraint 自定义外键名 foreign key(外键字段) references 表名(字段)//删除主键约束alter table 表名 drop constraint 主键名//删除外键约束alter table 表名 drop constraint 外键名 添加信息 insert into 表名 values(值1,值2,....);insert into 表名(字段1,字段3) values(值1,值3);insert into 表名 select ...;例题:给“Aufr”同学选上2010年秋季学期的所有课程
insert into takesselect id,course_id,sec_id,semester,year,nullfrom student a,section bwhere a.name='Aufr' and b.year = 2010 and b.semester= 'Fall'; 删除信息 delete from 表名 where 条件;例题:删除“Comp. Sci.”学院“Ploski”同学,所有成绩为’C-’的选课记录
delete from takes awhere exists(select 1 from student b where a.id=b.idand b.dept_name = 'Comp. Sci.' and b.name ='Ploski')and a.grade = 'C-'; 更新信息 update 表名 set 字段=new字段 where 条件;例题: 将“Comp. Sci.” 学院所有低于学校平均工资老师的涨薪10%,但是最高不能超过学校平均工资
update instructorset salary =case when salary *1.1 > (select avg(salary) frominstructor) then(select avg(salary) frominstructor)else salary * 1.1endwhere dept_name = 'Comp. Sci.'and salary < (select avg(salary) from instructor); 查询常用函数 avg() :求平均值distinct : 去重max() : 求最大值min() : 求最小值sum() : 求和count() : 求记录的行数count(*) : 包括nullcount(字段) : 该字段中不为null 的行数group by 字段 : 按字段分组order by 字段,字段 : 按字段排序,desc 降序,默认为升序union all 合并不去重//窗口函数//排序rank(),dense_rank(),row_number()// row_number 不存在并列,不会有相同的数字//dense_rank 存在并列,不会跳数字//rank() 存在并列,会出现数字的中断select id,score,row_number() over (order by score desc) as row_number,dense_rank() over (order by score desc) as dense_rank1,rank() over (order by score desc) as rank1from scores//over : 在什么条件之上partition by 字段 : 按字段划分 idscorerow_number1dense_rank1rank1019911103992110288323 例题:使用标量子查询,查询各院开设课程修课人数最多的前三门课程 with ta as(select dept_name,course_id,title,count (distinct id) cnt from course natural join takes group by dept_name,course_id,title),tb as(select dept_name,course_id,title,cnt,rank() over(partition by dept_name order by cnt desc) rkfrom ta)select * from tbwhere rk a.cnt) rkfrom ta a)select * from tb where rk